﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Viaticos.Entities;
using HerGoS.Interfaces;

namespace HerGoS.Viaticos.Engine
{
   public class GestorViaticos
    {
       public static List<PorcentajeViatico> ConsultarPorcentajeViatico()
       {
           try
           {
               return  new List<PorcentajeViatico>()
                                              { 
                                                  
                                                  new PorcentajeViatico {OID = 1 , Valor = 25}, 
                                                  new PorcentajeViatico {OID = 2 , Valor = 50}, 
                                                  new PorcentajeViatico {OID = 3 , Valor = 75}, 
                                                  new PorcentajeViatico {OID = 4 , Valor = 100},
                                                  new PorcentajeViatico {OID = 5 , Valor = 0}

                                              };
                

           }
           catch (Exception ex)
           {
              return null;
           }
       }

       public static CalculoViaticos CalcularVitaticos( Liquidacion liquidacion) 
       {
           CalculoViaticos cal = new CalculoViaticos();
           
           if (liquidacion.Tramos.Count == 1)
           {
               cal.LiquidacionOK = false;
               return cal;
           }
           
           
          List<Tramo> tramos = liquidacion.Tramos; 
                               
           decimal porcentajeAplicacionUltimoTramo = 0;
           int indiceUltimo = tramos.Count - 1;
           var cant = tramos.Count - 2;

           for (int i = 0; i <= tramos.Count-1; i++)
           {
               if (i <= cant)
               {
                   if (!tramos[i].DiasViaticosManual)
                   {
                       double res = tramos[i + 1].FechaDestino.Value.Date.Subtract(tramos[i].FechaOrigen.Value.Date).TotalDays;
                       cal.DiasViaticosTramos.Add(Convert.ToDecimal(res));
                       tramos[i].DiasViaticos = Convert.ToDecimal(res);
                   }
                   else
                   {
                       cal.DiasViaticosTramos.Add(tramos[i].DiasViaticos);
                   }
               }
               else // tratamiento ultimo
               {
                   var nHora = tramos[indiceUltimo].FechaDestino.Value.TimeOfDay;

                   TimeSpan hora12Mediodia = new TimeSpan(12, 00, 00);

                   if (tramos[i].DiasViaticosManual)
                   {
                       cal.DiasViaticosTramos.Add(tramos[i].DiasViaticos);
                   }
                   else
                   {
                        if (nHora > hora12Mediodia)
                        {
                            cal.Medioviatico = true;
                            cal.DiasViaticosTramos.Add(0.5M);
                            tramos[i].DiasViaticos = 0.5M;
                        }
                        else 
                        {
                             cal.DiasViaticosTramos.Add(0);
                             tramos[i].DiasViaticos = 0;
                            cal.Medioviatico = false;
                        }
                   }
               
               }
                              
           }
           ///tratamiento del ultimo :          
           

          
               
           //    porcentajeAplicacionUltimoTramo = 0.5M;
              

           //}
           //else
           //{
           //    cal.Medioviatico = false;
           //    porcentajeAplicacionUltimoTramo = 0;

           //}

           var tarifakmRecorridos = GestorTarifaKmRecorridos.Consultar().FirstOrDefault();
           decimal precioKm = tarifakmRecorridos.Montokm;

           for (int i = 0; i <= tramos.Count-1; i++)
           {               
               cal.CantidadTerminales = cal.CantidadTerminales + 2;
               
               if (tramos[i].AnularMontoTerminalOrigenIda)
               {
                   cal.CantidadTerminales = cal.CantidadTerminales - 1;
               }

               if (tramos[i].AnularMontoTerminalDestinoIda)
               {
                   cal.CantidadTerminales = cal.CantidadTerminales - 1;
               }


               cal.MontoTerminal.Add((tramos[i].AnularMontoTerminalOrigenIda ? 0 : 1) * tramos[i].MontoTerminalOrigenIda + tramos[i].MontoTerminalDestinoIda * (tramos[i].AnularMontoTerminalDestinoIda ? 0 : 1));

               if (tramos[i].Transporte.CALCULOKMS)
               {
                   cal.CantidadkmRecorridos += tramos[i].kmRecorridos.Value;

                   
                   cal.TotalPrecioKmRecorridos += tramos[i].kmRecorridos.Value * precioKm;
               }
                if (i <= cant)
                {
                    cal.MontoTramos.Add(cal.DiasViaticosTramos[i] * tramos[i].TarifaDiariaDestino * (tramos[i].PorcentajeViatico/100));
                }
                               
           }

            // tratamiento ultimo
           cal.MontoTramos.Add(cal.DiasViaticosTramos[indiceUltimo] * tramos[indiceUltimo - 1].TarifaDiariaDestino * (tramos[indiceUltimo].PorcentajeViatico / 100));

           cal.TotalCantidadViaticos = cal.DiasViaticosTramos.Sum();
           cal.TotalMontoViatico =  cal.MontoTramos.Sum();
           cal.TotalesTerminales = cal.MontoTerminal.Sum();

           cal.TotalGastos = liquidacion.LGastos.Count == 0 ? 0 : CalculoGastos(liquidacion.LGastos.Where(x => x.Persistencia != EstadoPersistencia.DELETE).ToList());

           if (liquidacion.Anticipo)
           {
             //  cal.TotalGeneral = cal.TotalMontoViatico * 0.80M + cal.TotalesTerminales;
               cal.TotalGeneral = cal.TotalMontoViatico * 0.80M;
           }

           else
           {
               bool TieneAnticiposAnteriores = GestorSolicitudes.SolicitudTieneAnticipo(liquidacion.SolicitudLiquidada);
               cal.TotalAnticipos = 0;

               if (TieneAnticiposAnteriores)
               {
                   cal.TotalAnticipos = GestorSolicitudes.TraerAnticipoSolicitud(liquidacion.SolicitudLiquidada);
               }


               cal.TotalGeneral = (cal.TotalMontoViatico + cal.TotalesTerminales + cal.TotalGastos + cal.TotalPrecioKmRecorridos) - cal.TotalAnticipos;
           }


           

           cal.LiquidacionOK = true;

           return cal;

       }

       private static decimal CalculoGastos(List<Gastos> gastos)
       {
           if (gastos.Count > 0)
               return gastos.Sum(y => y.MontoGasto);
           return 0;
       }

    }
}
